/**
 * DDNS:动态ip解析到固定域名上
 * 现在支持：
 *      2 腾讯云域名
 */

const publicIp = require('public-ip');
const Request = require("request");

// 常量
const dnsTableName = 'ddns_info';

const CONFIG = require('./conf')

// 腾讯云
const TencentCloud = require("tencentcloud-sdk-nodejs");
const DnspodClient = TencentCloud.dnspod.v20210323.Client;
const clientConfig = {
    credential: {
        secretId: CONFIG.tengxunyun.secretId,
        secretKey: CONFIG.tengxunyun.secretKey,
    },
    region: "",
    profile: {
        httpProfile: {
            endpoint: CONFIG.tengxunyun.endpoint,
        },
    },
};

// doc-url: https://cloud.tencent.com/document/product/1427/56166
const NodeClient = new DnspodClient(clientConfig);


/***
 * 获取腾讯云的域名解析列表
 * @type {{Value: string, RecordId: string, Domain: string, RecordLine: string}}
 */
function getTengXunRecordList() {
    const params = {
        Domain: 'cdbytech.top',
        RecordType: 'A'
    };
    NodeClient.DescribeRecordList(params).then(
        (data) => {
            console.log('TengXunDomainDescribeRecordList: ', data);
        },
        (err) => {
            console.error("error", err);
        }
    );
}

/**
 * 更新ddns
 */
function updateDDNS(public_ip) {
    return new Promise((resolve, reject) => {
        const dnsParams = {
            Domain: CONFIG.tengxunyun.domain,
            RecordId: CONFIG.tengxunyun.recordId,
            RecordLine: '默认',
            SubDomain: CONFIG.tengxunyun.subDomainLyw,
            Value: public_ip
        }
        NodeClient.ModifyDynamicDNS(dnsParams).then(data => {
            resolve(data)
        }).catch(e => {
            console.log('eeee', e)
            reject(e)
        })
    })
}

/**
 *  更新域名解析的ip
 *  1. 判断ip地址是否有变化或上一次没有更新成功
 *  2. 写入本地数据库： is_success默认为0
 *  3. 更新DDNS
 */
function dnsUpdate() {
    publicIp.v4().then(public_ip => {
        const sql = `select ip,is_success from ${CONFIG.dns_table_name} order by id desc limit 1`;
        const update_status_sql = `UPDATE ${CONFIG.dns_table_name} SET is_success=?,err_msg=? ORDER BY update_time DESC LIMIT 1;`;

        by_db(sql,[]).then(data => {
            console.log('----数据库最新的ip', data);
            let c_a = public_ip !== data[0].ip
            let c_b = +data[0][`is_success`] === 0

            // ip地址有变化或上一次没有更新成功
            if (c_a || c_b) {

                const addSql = `INSERT INTO ${CONFIG.dns_table_name} (ip,update_time) VALUES (?,?)`;
                const time = new Date().getTime()

                console.log('----正在写入IP...')
                // 写入数据库
                by_db(addSql,[public_ip, time]).then(() => {

                    console.log('----写入IP成功!')

                    // 更改域名解析的IP
                    console.log(`----更新【${CONFIG.ddns_type}】域名解析...`);
                    updateDDNS(public_ip).then(res => {
                        console.log(`----更新域名成功：${JSON.stringify(res.data || res || '{}')}`)

                        // 更新数据IP记录的状态
                        by_db(update_status_sql, ['1', '']).then(() => {
                            console.log('已将成功更新写入数据库')
                            /** 本次域名更新结束 **/
                            /** update over **/

                            /**
                             * 将最新的ip写入腾讯的mysql
                             */
                            Request({
                                url: 'http://docs.cdbytech.top:3000/updateIp',
                                method: 'post',
                                headers: {
                                    'Content-Type': 'application/json'
                                },
                                body: JSON.stringify({ ip: public_ip })
                            }, (error, response, body) => {
                                if (!error && response.statusCode === 200) {
                                    console.log('tengxun ip：更新成功')
                                } else {
                                    console.log('tengxun ip：更新失败: ', error)
                                }
                            })

                        })


                    }).catch(e => {
                        const err_msg = JSON.stringify(e.data || e || '{}')
                        console.log(`----更新域名失败：${err_msg}`)

                        by_db(update_status_sql, ['0', err_msg]).then(() => {
                            console.log('已将失败更新写入数据库')
                        })

                    })
                }).catch(e => {
                    console.log('----写入ip失败:', e)
                })
            } else {
                console.log('----当前的公网ip是最新的, 无需更新!')
            }
        }).catch(e => {
            // 连接错误11
            console.log(`连接数据库发生错误:${e} on time: ${new Date().getTime()}`)
        });
        // 黄色
        console.log('\x1b[33m%s\x1b[0m', `本地公网ip: ${public_ip}`);
        //=> '46.5.21.123'
    });
}

// getRecordId();

/**
 * 将龙樾湾的动态IP解析到阿里云固定的域名上，
 * 只有当构建环境为 pro 时，才进行相应操作
 */
const _env = process.env.NODE_ENV
console.log('当前的环境变量', _env)
if (_env === 'gmac') {
    console.log(`----更新ddns...`)
    dnsUpdate();

    // 五分钟更新一次
    setInterval(() => {
        dnsUpdate();
    }, 5 * 60 * 1000);

} else {
    // dnsUpdate();
    console.log(`当前环境: ${_env},将不进行DDNS。`)
    /**
     * 主要用于新增域名时获得: recordId
     * 源文件在： tengDDNS
     */
    const getRecordListFlag = false
    const _t = CONFIG.ddns_type === 'tengxunyun'
    if (getRecordListFlag && _t) {
        getTengXunRecordList()
    }
}


/**
 * 获取 ip_v6
 */
// publicIp.v6().then(ip => {
//     console.log(ip);
//     //=> 'fe80::200:f8ff:fe21:67cf'
// });
